<?php
/**
 * Passport 加密函数
 *
 * @param		string		等待加密的原字串
 * @param		string		私有密匙(用于解密和加密)
 *
 * @return	string		原字串经过私有密匙加密后的结果
 */
function passport_encrypt($txt, $key) {
	
	// 使用随机数发生器产生 0~32000 的值并 MD5()
	srand ( ( double ) microtime () * 1000000 );
	$encrypt_key = md5 ( rand ( 0, 32000 ) );
	
	// 变量初始化
	$ctr = 0;
	$tmp = '';
	
	// for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
	for($i = 0; $i < strlen ( $txt ); $i ++) {
		// 如果 $ctr = $encrypt_key 的长度，则 $ctr 清零
		$ctr = $ctr == strlen ( $encrypt_key ) ? 0 : $ctr;
		// $tmp 字串在末尾增加两位，其第一位内容为 $encrypt_key 的第 $ctr 位，
		// 第二位内容为 $txt 的第 $i 位与 $encrypt_key 的 $ctr 位取异或。然后 $ctr = $ctr + 1
		$tmp .= $encrypt_key [$ctr] . ($txt [$i] ^ $encrypt_key [$ctr ++]);
	}
	
	// 返回结果，结果为 passport_key() 函数返回值的 base64 编码结果
	return base64_encode ( passport_key ( $tmp, $key ) );

}

/**
 * Passport 解密函数
 *
 * @param		string		加密后的字串
 * @param		string		私有密匙(用于解密和加密)
 *
 * @return	string		字串经过私有密匙解密后的结果
 */
function passport_decrypt($txt, $key) {
	
	// $txt 的结果为加密后的字串经过 base64 解码，然后与私有密匙一起，
	// 经过 passport_key() 函数处理后的返回值
	$txt = passport_key ( base64_decode ( $txt ), $key );
	
	// 变量初始化
	$tmp = '';
	
	// for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
	for($i = 0; $i < strlen ( $txt ); $i ++) {
		// $tmp 字串在末尾增加一位，其内容为 $txt 的第 $i 位，
		// 与 $txt 的第 $i + 1 位取异或。然后 $i = $i + 1
		$tmp .= $txt [$i] ^ $txt [++ $i];
	}
	
	// 返回 $tmp 的值作为结果
	return $tmp;

}

/**
 * Passport 密匙处理函数
 *
 * @param		string		待加密或待解密的字串
 * @param		string		私有密匙(用于解密和加密)
 *
 * @return	string		处理后的密匙
 */
function passport_key($txt, $encrypt_key) {
	
	// 将 $encrypt_key 赋为 $encrypt_key 经 md5() 后的值
	$encrypt_key = md5 ( $encrypt_key );
	
	// 变量初始化
	$ctr = 0;
	$tmp = '';
	
	// for 循环，$i 为从 0 开始，到小于 $txt 字串长度的整数
	for($i = 0; $i < strlen ( $txt ); $i ++) {
		// 如果 $ctr = $encrypt_key 的长度，则 $ctr 清零
		$ctr = $ctr == strlen ( $encrypt_key ) ? 0 : $ctr;
		// $tmp 字串在末尾增加一位，其内容为 $txt 的第 $i 位，
		// 与 $encrypt_key 的第 $ctr + 1 位取异或。然后 $ctr = $ctr + 1
		$tmp .= $txt [$i] ^ $encrypt_key [$ctr ++];
	}
	
	// 返回 $tmp 的值作为结果
	return $tmp;

}

/**
 * Passport 信息(数组)编码函数
 *
 * @param		array		待编码的数组
 *
 * @return	string		数组经编码后的字串
 */
function passport_encode($array) {
	
	// 数组变量初始化
	$arrayenc = array ();
	
	// 遍历数组 $array，其中 $key 为当前元素的下标，$val 为其对应的值
	foreach ( $array as $key => $val ) {
		// $arrayenc 数组增加一个元素，其内容为 "$key=经过 urlencode() 后的 $val 值"
		$arrayenc [] = $key . '=' . urlencode ( $val );
	}
	
	// 返回以 "&" 连接的 $arrayenc 的值(implode)，例如 $arrayenc = array('aa', 'bb', 'cc', 'dd')，
	// 则 implode('&', $arrayenc) 后的结果为 ”aa&bb&cc&dd"
	return implode ( '&', $arrayenc );

}

function DZ_API($user_info, $action, $forward, $passport_key = AUTH_KEY) {
	global $time_stamp, $forums;
	if ($action == "login") {
		//$user_info['cookietime'] = 86400;
	//$auth = passport_encrypt(passport_encode($user_info), $passport_key);
	} elseif ($action == "logout") {
		//$user_info['cookietime'] = 1197524733;
	}
	$user_info ['time'] = $time_stamp;
	$auth = passport_encrypt ( passport_encode ( $user_info ), $passport_key );
	$verify = md5 ( $action . $auth . $forward . $passport_key );
	if ($forums ['switch'] == true && $forums ['type'] == "discuz") {
		$gopage = $forums ['url'] . "api/passport.php" . "?action=$action" . "&auth=" . rawurlencode ( $auth ) . "&forward=" . rawurlencode ( $forward ) . "&verify=" . rawurlencode ( $verify );
	} else {
		$goto_page = $forward;
	}
	return $gopage;
}
?>